package com.cloud.thread;

import java.lang.ref.PhantomReference;
import java.lang.ref.SoftReference;
import java.lang.ref.WeakReference;
import java.util.concurrent.TimeUnit;

/**
 * @Author tangyuan2meicloud.com
 * @DATE 2021/7/8 15:43
 * @Desc
 * @Remarks
 */

/**
 * 强弱软虚四种引用
 */

public class RefDemo {

    public static void main(String[] args) {
        strangeRef();

        weakRef();

        softRef();

        phantomRef();
    }

    /**
     * 虚引用是超脱JVM内存管理的对象的引用，比如NIO中，操作的对象可以使用系统内存，所以这个引用是虚引用，只能进行通知，无法实际的操纵（控制权在OS中）
     */
    private static void phantomRef() {
//        PhantomReference
    }

    /**
     * 系统进行GC 只有内存不够用，才会清理SoftReference的对象
     */
    private static void softRef() {
        SoftReference<Integer> softReference = new SoftReference<>(1000);
        System.out.println(softReference.get());
        System.gc();
        try {
            TimeUnit.SECONDS.sleep(1);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(softReference.get());
    }

    /**
     * 只要系统进行GC 无论是否内存够用，都会清理WeakReference的对象
     */
    private static void weakRef() {
        WeakReference<Integer> weakReference = new WeakReference<Integer>(1000);
        System.out.println(weakReference.get());
        System.gc();
        try {
            TimeUnit.SECONDS.sleep(1);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(weakReference.get());
    }

    /**
     * 根据GC root，只要是强引用的数据，就算OOM也不会将数据进行GC清理
     */
    private static void strangeRef() {
        String string = new String("123445");
        System.gc();
        try {
            TimeUnit.SECONDS.sleep(1);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(string);
    }
}
